package com.lmscn.lms.api.util;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.security.Key;
import java.security.SecureRandom;

public class DesEncryptionUtil {  
   
    private static Key key = null;
    private static Charset charset;
    static{
        try {
        charset = Charset.forName("UTF-8");
        String strKey = "833bd8020e71d7ba838effc56c406d11";
        KeyGenerator _generator = KeyGenerator.getInstance("DES");
        //防止linux下 随机生成key
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
        secureRandom.setSeed(strKey.getBytes(charset));

        _generator.init(56, secureRandom);
        key = _generator.generateKey();
        _generator = null ;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   
    private DesEncryptionUtil() {
    }  
    /**
      * 加密 String 明文输入 ,String 密文输出 
      */  
    public static String encryptStr(String mingwen) {
    	if(mingwen == null){
    		return null;
    	}
       byte [] byteMi = null ;  
       byte [] byteMing = null ;  
       String strMi = "" ;  
       BASE64Encoder base64en = new BASE64Encoder();  
       try {  
           byteMing = mingwen.getBytes(charset);
           byteMi = encryptByte(byteMing);  
           strMi = base64en.encode(byteMi);  
           return strMi;
       } catch (Exception e) {  
    	   return null;
       }
    }
   
    /** 
      * 解密 以 String 密文输入 ,String 明文输出 
      * @param
      * @return 
      */  
    public static String decryptStr(String miwen) {  
       BASE64Decoder base64De = new BASE64Decoder();
       byte [] byteMing = null ;  
       byte [] byteMi = null ;  
       String strMing = "" ;  
       try {  
           byteMi = base64De.decodeBuffer(miwen);
           byteMing = decryptByte(byteMi);
           strMing = new String(byteMing,charset);
           return strMing;
       } catch (Exception e) {  
    	   return null;
       }
    }
   
    /** 
      * 加密以 byte[] 明文输入 ,byte[] 密文输出 
      * 
      * @param byteS 
      * @return 
      */  
    private static byte [] encryptByte( byte [] byteS) {  
       byte [] byteFina = null ;  
       Cipher cipher;  
       try {  
           cipher = Cipher.getInstance ( "DES" );  
           cipher.init(Cipher. ENCRYPT_MODE , key );  
           byteFina = cipher.doFinal(byteS);  
       } catch (Exception e) {  
           throw new RuntimeException(  
                  "Error initializing SqlMap class. Cause: " + e);  
       } finally {  
           cipher = null ;  
       }  
       return byteFina;  
    }  
   
    /** 
      * 解密以 byte[] 密文输入 , 以 byte[] 明文输出 
      * 
      * @param byteD 
      * @return 
      */  
    private static byte [] decryptByte( byte [] byteD) {  
       Cipher cipher;  
       byte [] byteFina = null ;  
       try {  
           cipher = Cipher.getInstance ( "DES" );  
           cipher.init(Cipher. DECRYPT_MODE , key );  
           byteFina = cipher.doFinal(byteD);  
       } catch (Exception e) {  
           throw new RuntimeException(  
                  "Error initializing SqlMap class. Cause: " + e);  
       } finally {  
           cipher = null ;  
       }  
       return byteFina;  
    }  
   
    /** 
      * 文件 file 进行加密并保存目标文件 destFile 中 
      * 
      * @param file 
      *             要加密的文件 如 c:/test/srcFile.txt 
      * @param destFile 
      *             加密后存放的文件名 如 c:/ 加密后文件 .txt 
      */  
    public static void encryptFile(String file, String destFile) throws Exception {  
       Cipher cipher = Cipher.getInstance ( "DES" );  
       // cipher.init(Cipher.ENCRYPT_MODE, getKey());  
       cipher.init(Cipher.ENCRYPT_MODE ,key );  
       InputStream is = new FileInputStream(file);  
       OutputStream out = new FileOutputStream(destFile);  
       CipherInputStream cis = new CipherInputStream(is, cipher);  
       byte [] buffer = new byte [1024];  
       int r;  
       while ((r = cis.read(buffer)) > 0) {  
           out.write(buffer, 0, r);  
       }  
       cis.close();  
       is.close();  
       out.close();  
    }  
   
    /** 
      * 文件采用 DES 算法解密文件 
      * @param file
      *             已加密的文件 如 c:/ 加密后文件 .txt * 
      * @param destFile 
      *             解密后存放的文件名 如 c:/ test/ 解密后文件 .txt 
      */  
    public static void decryptFile(String file, String dest) throws Exception {  
       Cipher cipher = Cipher.getInstance ( "DES" );  
       cipher.init(Cipher. DECRYPT_MODE ,key );  
       InputStream is = new FileInputStream(file);  
       OutputStream out = new FileOutputStream(dest);  
       CipherOutputStream cos = new CipherOutputStream(out, cipher);  
       byte [] buffer = new byte [1024];  
       int r;  
       while ((r = is.read(buffer)) >= 0) {  
           cos.write(buffer, 0, r);  
       }  
       cos.close();  
       out.close();  
       is.close();  
    }  
   
    public static void main(String[] args) throws Exception {  
       String str1 = " 要加密的字符串 test" ;
       String str2 = DesEncryptionUtil.encryptStr(str1);
       String deStr = DesEncryptionUtil.decryptStr(str2);
       System. out .println( " 加密前： " + str1);  
       System. out .println( " 加密后： " + str2);  
       System. out .println( " 解密后： " + deStr);  
    }  
}   